home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / passwrd2.arc / PWORD.ASM next >
Encoding:
Assembly Source File  |  1985-12-20  |  4.8 KB  |  188 lines

  1. ;------------------------------------------------------------
  2. ;PASSWORD.ASM (CREATES PWORD.SYS, DEVICE DRIVER)
  3. ;DOS 2.00 DEVICE DRIVER FORCES USER TO ENTER PASSWORD ON BOOTING UP
  4. ;AND DISABLES Ctrl-Break.
  5. ;
  6. ;AFTER ASSEMBLY: LINK PASSWORD (ignore "no STACK" error)
  7. ;             EXE2BIN PASSWORD PASSWORD.SYS
  8. ;             PLACE DEVICE=PASSWORD.SYS IN CONFIG.SYS FILE
  9. ;             REBOOT SYSTEM WITH Ctrl-Alt-Del
  10. ;             ANSWER PROMPT WITH: Password <ENTER>
  11.  
  12. DEV_SEG SEGMENT
  13. PWORD_DEVICE PROC FAR
  14.     ASSUME CS:DEV_SEG, DS:DEV_SEG, ES:DEV_SEG
  15.  
  16. ;---------------------------------------------------------------
  17. ;The following lines are the device header, which must exist for
  18. ;every device. This file has only one device, and it works with
  19. ;character I/O. It doesn't actually handle any I/O services,
  20. ;but it's easier to create a character device.
  21.  
  22. PWORD_DEV_HEADER:    ;label for the start of the device driver
  23.  
  24. NEXT_DEV_PTR    DD  -1     ;only 1 device is defined in this file
  25. DEV_ATTRIBUTE    DW  1000000000000000B
  26. STRATEGY_PTR    DW  STRATEGY   ;the installation procedure
  27. INTERUPT_PTR    DW  INTERUPT   ;the proc that handles all services
  28. DEVICE_NAME    DB  'PWORD'    ;8-byte string of device name
  29.  
  30. ; -- This is the storage area for the password --
  31. ; -- The first byte is the length (0-16) --------
  32. ; -- The following characters are the password --
  33. ; -- Only an exact match will allow the system --
  34. ; -- to continue the boot process ---------------
  35.  
  36. PASSWORD_STORE DB 4,'plan'
  37.            DB $-PASSWORD_STORE DUP(' ')  ;leave room for a
  38.                          ;16-character password
  39.  
  40. IN_BUF_MAX DB 16
  41. IN_BUF_LEN DB ?
  42. IN_BUF     DB 16 DUP(?)
  43.  
  44. BREAK_SEG  DW
  45. BREAK_OFF  DW
  46.  
  47. ; -- The STRATEGY proc stores ES:BX request header pointer here
  48. ; -- The INTERUPT proc retrieves it
  49.  
  50. REQUEST_PTR LABEL DWORD
  51. REQ_PTR_OFF DW
  52. REQ_PTR_SEG DW    ?
  53.  
  54. DUMMY_IRET  DB  207     ;Ctrl-Break vector is pointed here, so it
  55.                         ;does nothing. Break is not recognized!
  56.  
  57. ;---------------------- Messages ----------------------------------
  58. ;These messages are expected to be output via the ANSI.SYS device,
  59. ;so it should be installed (named in the CONFIG.SYS file) before
  60. ;this PWORD device.
  61. ;If you don't want to use ANSI.SYS, remove the ESC sequences in the
  62. ;messages.
  63.  
  64. LF EQU 0AH
  65. CR EQU 0DH
  66. ESC EQU 1BH
  67.  
  68. MSG_1 DB CR,LF,ESC,'[0m'      ;make output visible
  69.       DB 'Enter Password: '
  70.       DB ESC,'[8m$'           ;make input invisible
  71.  
  72. MSG_2 DB CR,LF,ESC,'[0m'      ;make output visible
  73.       DB 'Password accepted.',CR,LF,'$'
  74.  
  75. ;====================================================================
  76. ;STRATEGY procedure
  77. ;Just saves the request header pointer for the INTERUPT proc
  78.  
  79. STRATEGY PROC FAR
  80.      ASSUME CS:DEV_SEG
  81.      MOV    CS:REQ_PTR_OFF,BX
  82.      MOV    CS:REQ_PTR_SEG,ES
  83.      RET
  84. STRATEGY ENDP
  85.  
  86. ;=====================================================================
  87. ;INTERUPT procedure
  88. ;Processes the command indicated in the request header.
  89.  
  90. INTERUPT PROC FAR
  91.      ASSUME CS:DEV_SEG, DS:NOTHING, ES:NOTHING
  92.      PUSH    DS
  93.      PUSH    ES
  94.      PUSH     AX
  95.      PUSH     BX
  96.      PUSH   CX
  97.      PUSH    DX
  98.      PUSH     DI
  99.      PUSH    SI
  100.      MOV    AX,CS
  101.      MOV    DS,AX
  102.  
  103.      LES    BX,REQUEST_PTR
  104.      MOV    AL,ES:[BX+2]
  105.      CMP    AL,0
  106.      JE     INIT_FN
  107. ERROR_EXIT:
  108.      OR    WORD PTR ES:[BX+3],8003H
  109. COMMON_EXIT:
  110.      OR    WORD PTR ES:[BX+3],100H
  111.      POP    SI
  112.      POP     DI
  113.      POP    DX
  114.      POP    CX
  115.      POP     BX
  116.      POP    AX
  117.      POP    ES
  118.      POP    DS
  119.      RET
  120.  
  121. INIT_FN PROC NEAR
  122.      PUSH     ES
  123.  
  124. ;The following 8 lines eliminate Ctrl-Break from having any effect
  125. ;on the system, unless another program KEYBOARD_BREAK vector is
  126. ;altered (BASIC does that).
  127. ; OLD BREAK VECTOR IS STORED SO THAT IT MAY BE RESET
  128.  
  129.      MOV    AX,0
  130.      MOV    ES,AX
  131.      MOV  AX,WORD PTR ES:[1Bh*4]
  132.      MOV  BREAK_SEG,AX
  133.      MOV  AX,WORD PTR ES:[1Bh*4+2]
  134.      MOV  BREAK_OFF,AX
  135.      MOV     WORD PTR ES:[1Bh*4],OFFSET DUMMY_IRET
  136.      MOV    WORD PTR ES:[1Bh*4+2],CS
  137.      JMP    SHORT NO_BEEP
  138. TRY_AGAIN:
  139.      MOV    AL,7
  140.      MOV    AH,0EH
  141.      INT    10H
  142. NO_BEEP:
  143.      MOV    DX,OFFSET MSG_1    ;"Enter Password: "
  144.      MOV     AH,9
  145.      INT    21H
  146.  
  147.      MOV    DX,OFFSET IN_BUF_MAX
  148.      MOV    AH,0CH
  149.      MOV    AL,0AH
  150.      INT    21H
  151.      MOV    AX,CS
  152.      MOV     ES,AX
  153.  
  154.      MOV    SI,OFFSET IN_BUF_LEN
  155.      MOV    DI,OFFSET PASSWORD_STORE
  156.      MOV    CH,0
  157.      MOV    CL,[SI]
  158.      CMP    CL,[DI]
  159.      JNE    TRY_AGAIN
  160.      INC    DI
  161.      INC     SI
  162.      REP    CMPSB    
  163.      JNE    TRY_AGAIN
  164.  
  165.      MOV    DX,OFFSET MSG_2    ;"Password acceped"
  166.      MOV    AH,9
  167.      INT    21H
  168.  
  169. ; THE FOLLOWING 6 LINES RESTORE THE CTL-BREAK VECTOR
  170.  
  171.      MOV    AX,0
  172.      MOV    ES,AX
  173.      MOV  AX,BREAK_SEG
  174.      MOV  WORD PTR ES:[1Bh*4],AX
  175.      MOV  AX,BREAK_OFF
  176.      MOV  WORD PTR ES:[1Bh*4+2],AX
  177.  
  178.      POP    ES
  179.      MOV    WORD PTR ES:[BX+0EH],OFFSET INIT_FN
  180.      MOV    WORD PTR ES:[BX+10H],CS
  181.  
  182.      JMP    COMMON_EXIT
  183. INIT_FN  ENDP
  184. INTERUPT ENDP
  185. PWORD_DEVICE    ENDP
  186. DEV_SEG     ENDS
  187.      END PWORD_DEV_HEADER
  188.